rendernode: Require passing a renderer to get_draw_context()
authorBenjamin Otte <otte@redhat.com>
Tue, 1 Nov 2016 04:45:01 +0000 (05:45 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 1 Nov 2016 15:32:26 +0000 (16:32 +0100)
This is in preparation of making render nodes independent of the
renderer, so that they can be rendered multiple times with different
renderers.

15 files changed:
gsk/gskrenderer.h
gsk/gskrendernode.c
gsk/gskrendernode.h
gsk/gsktypes.h
gtk/gtkaccellabel.c
gtk/gtkcssgadget.c
gtk/gtkdebugupdates.c
gtk/gtkflowbox.c
gtk/gtkframe.c
gtk/gtkimage.c
gtk/gtklabel.c
gtk/gtkpopover.c
gtk/gtkrenderbackground.c
gtk/gtkwidget.c
gtk/gtkwindow.c

index 094fc7ee0edd2d3a2ebdf38d05b3d6dc0943b25e..d3e1b3e46ba300763d3c7437ea20a642873dec7d 100644 (file)
@@ -33,7 +33,6 @@ G_BEGIN_DECLS
 #define GSK_RENDERER(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSK_TYPE_RENDERER, GskRenderer))
 #define GSK_IS_RENDERER(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSK_TYPE_RENDERER))
 
-typedef struct _GskRenderer             GskRenderer;
 typedef struct _GskRendererClass        GskRendererClass;
 
 GDK_AVAILABLE_IN_3_90
index 6a1625dc22bc8117ba8e50ffba46b604aa355e91..c1494cb79a441bf777190f94ccbd6b080ba65776 100644 (file)
@@ -1378,9 +1378,12 @@ gsk_render_node_get_blend_mode (GskRenderNode *node)
 /**
  * gsk_render_node_get_draw_context:
  * @node: a #GskRenderNode
+ * @renderer: (nullable): Renderer to optimize for or %NULL for any
  *
  * Creates a Cairo context for drawing using the surface associated
  * to the render node.
+ * If no surface exists yet, a surface will be created optimized for
+ * rendering to @renderer.
  *
  * Returns: (transfer full): a Cairo context used for drawing; use
  *   cairo_destroy() when done drawing
@@ -1388,20 +1391,32 @@ gsk_render_node_get_blend_mode (GskRenderNode *node)
  * Since: 3.90
  */
 cairo_t *
-gsk_render_node_get_draw_context (GskRenderNode *node)
+gsk_render_node_get_draw_context (GskRenderNode *node,
+                                  GskRenderer   *renderer)
 {
   cairo_t *res;
 
   g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
   g_return_val_if_fail (node->is_mutable, NULL);
+  g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);
 
   if (node->surface == NULL)
     {
-      node->surface = gsk_renderer_create_cairo_surface (node->renderer,
-                                                         node->opaque ? CAIRO_FORMAT_RGB24
-                                                                      : CAIRO_FORMAT_ARGB32,
-                                                         ceilf (node->bounds.size.width),
-                                                         ceilf (node->bounds.size.height));
+      if (renderer)
+        {
+          node->surface = gsk_renderer_create_cairo_surface (renderer,
+                                                             node->opaque ? CAIRO_FORMAT_RGB24
+                                                                          : CAIRO_FORMAT_ARGB32,
+                                                             ceilf (node->bounds.size.width),
+                                                             ceilf (node->bounds.size.height));
+        }
+      else
+        {
+          node->surface = cairo_image_surface_create (node->opaque ? CAIRO_FORMAT_RGB24
+                                                                   : CAIRO_FORMAT_ARGB32,
+                                                      ceilf (node->bounds.size.width),
+                                                      ceilf (node->bounds.size.height));
+        }
     }
 
   res = cairo_create (node->surface);
index 90006f1c7e12f2f5ef457e217fa45a0057dc830a..386342376225119636c5c4a20c8306b82ce4e7ba 100644 (file)
@@ -111,7 +111,8 @@ void                    gsk_render_node_set_opaque              (GskRenderNode *
 GDK_AVAILABLE_IN_3_90
 gboolean                gsk_render_node_is_opaque               (GskRenderNode *node);
 GDK_AVAILABLE_IN_3_90
-cairo_t *               gsk_render_node_get_draw_context        (GskRenderNode   *node);
+cairo_t *               gsk_render_node_get_draw_context        (GskRenderNode *node,
+                                                                 GskRenderer   *renderer);
 
 GDK_AVAILABLE_IN_3_90
 void                    gsk_render_node_set_blend_mode          (GskRenderNode *node,
index 8513328ba5fb7e71ef3f79eb6b0bae4975fc740c..eae1591dad4665d9451f23bf9e3453b6c87bba93 100644 (file)
@@ -26,4 +26,6 @@
 #include <gdk/gdk.h>
 #include <gsk/gskenums.h>
 
+typedef struct _GskRenderer             GskRenderer;
+
 #endif /* __GSK_TYPES_H__ */
index 3be1e68b7ab97b1d6c03135c8ce7f4705b01dd0f..93b660af9619b8f99ea8483682eb9be670c78b3b 100644 (file)
@@ -489,7 +489,7 @@ gtk_accel_label_get_render_node (GtkWidget   *widget,
       gtk_widget_get_clip (widget, &clip);
       _gtk_widget_get_allocation (widget, &alloc);
 
-      cr = gsk_render_node_get_draw_context (node);
+      cr = gsk_render_node_get_draw_context (node, renderer);
       cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
 
       context = gtk_widget_get_style_context (widget);
index d7eac83fc756f9b2a4504b58e05be3db5528748f..dbce0c94d7f20cde307a9a364e0aad95e894f50a 100644 (file)
@@ -889,7 +889,7 @@ gtk_css_gadget_get_render_node (GtkCssGadget  *gadget,
   border_node = gsk_renderer_create_render_node (renderer);
   gsk_render_node_set_name (border_node, str);
   gsk_render_node_set_bounds (border_node, &bounds);
-  cr = gsk_render_node_get_draw_context (border_node);
+  cr = gsk_render_node_get_draw_context (border_node, renderer);
 
   gtk_css_style_render_border (style,
                                cr,
@@ -933,7 +933,7 @@ gtk_css_gadget_get_render_node (GtkCssGadget  *gadget,
           gsk_render_node_set_bounds (content_node, &content_bounds);
           gsk_render_node_set_transform (content_node, &content_transform);
 
-          cr = gsk_render_node_get_draw_context (content_node);
+          cr = gsk_render_node_get_draw_context (content_node, renderer);
 
           /* Compatibility mode: draw_focus is left to the draw() implementation */
           draw_focus = gadget_class->draw (gadget, cr,
@@ -956,7 +956,7 @@ gtk_css_gadget_get_render_node (GtkCssGadget  *gadget,
       gsk_render_node_set_name (focus_node, str);
       gsk_render_node_set_bounds (focus_node, &bounds);
 
-      cr = gsk_render_node_get_draw_context (focus_node);
+      cr = gsk_render_node_get_draw_context (focus_node, renderer);
       gtk_css_style_render_outline (style,
                                     cr,
                                     clip.left + margin.left,
index 1d3ab2133d125cccf67bbf704de68a8f90e65fbc..42e89b6b191949f39f1067fadafe33b3f26afd77 100644 (file)
@@ -292,7 +292,7 @@ gtk_debug_updates_get_render_node (GtkWidget   *widget,
   gtk_debug_updates_queue_get_extents (updates, &rect);
   gsk_render_node_set_bounds (node, &(graphene_rect_t) GRAPHENE_RECT_INIT(rect.x, rect.y, rect.width, rect.height));
 
-  cr = gsk_render_node_get_draw_context (node);
+  cr = gsk_render_node_get_draw_context (node, renderer);
 
   for (l = g_queue_peek_head_link (updates); l != NULL; l = l->next)
     {
index fd83a4861c8bdb609be658c3bd047543f8781087..f1bee97b96ecd8a0d6f2431fe2df7b2732d92b32 100644 (file)
@@ -2575,7 +2575,7 @@ gtk_flow_box_get_render_node (GtkWidget   *widget,
 
       node = gtk_widget_create_render_node (widget, renderer, "FlowBox RubberBand");
 
-      cr = gsk_render_node_get_draw_context (node);
+      cr = gsk_render_node_get_draw_context (node, renderer);
 
       vertical = priv->orientation == GTK_ORIENTATION_VERTICAL;
 
index 8ff208869f9bf0d5446ef1bc7a387bed75217a6b..d362de71b67ac46761411e1479e3084bb379f655 100644 (file)
@@ -695,7 +695,7 @@ gtk_frame_get_render_node (GtkWidget   *widget,
 
   node = gtk_css_gadget_get_render_node (priv->gadget, renderer, FALSE);
 
-  cr = gsk_render_node_get_draw_context (node);
+  cr = gsk_render_node_get_draw_context (node, renderer);
 
   /* We want to use the standard gadget drawing for the border,
    * so we clip out the label allocation in order to get the
index cb8b5430b0112ced584d2339d42e0dd8c8b82305..ae8dec8c5efaf04bddcd96f897d6947591cd9e29 100644 (file)
@@ -1425,7 +1425,7 @@ gtk_image_get_render_node (GtkWidget   *widget,
   gtk_widget_get_clip (widget, &clip);
   _gtk_widget_get_allocation (widget, &alloc);
 
-  cr = gsk_render_node_get_draw_context (node);
+  cr = gsk_render_node_get_draw_context (node, renderer);
   cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
   x = 0;
   y = 0;
index 1f74a8b4fab9f3cddbf175462863c74c129a6a34..16943f9ee89d44dc5ff809c3b84e785fdd7338b6 100644 (file)
@@ -4181,7 +4181,7 @@ gtk_label_get_render_node (GtkWidget   *widget,
   gtk_widget_get_clip (widget, &clip);
   _gtk_widget_get_allocation (widget, &alloc);
 
-  cr = gsk_render_node_get_draw_context (node);
+  cr = gsk_render_node_get_draw_context (node, renderer);
   cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
   x = 0;
   y = 0;
index 88d234c8816fe3d7781dcf95c2d8aeb8101a5287..9cbe815f540f044a6345f56ffc1ada7d28999613 100644 (file)
@@ -1395,7 +1395,7 @@ gtk_popover_get_render_node (GtkWidget *widget, GskRenderer *renderer)
   if (node == NULL)
     return NULL;
 
-  ct = gsk_render_node_get_draw_context (node);
+  ct = gsk_render_node_get_draw_context (node, renderer);
   gtk_popover_draw (widget, ct);
 
   cairo_destroy (ct);
index 6d0daf1189314c013636ad363c55b6c3b8329cf0..80e17dcb183a0fc738630dbd64a3f0003c599201 100644 (file)
@@ -499,7 +499,7 @@ gtk_css_style_add_background_render_nodes (GtkCssStyle      *style,
       bg_node = gsk_renderer_create_render_node (renderer);
       gsk_render_node_set_name (bg_node, str);
       gsk_render_node_set_bounds (bg_node, bounds);
-      cr = gsk_render_node_get_draw_context (bg_node);
+      cr = gsk_render_node_get_draw_context (bg_node, renderer);
       cairo_translate (cr, x, y);
       _gtk_css_shadows_value_paint_box (box_shadow,
                                         cr,
@@ -518,7 +518,7 @@ gtk_css_style_add_background_render_nodes (GtkCssStyle      *style,
       bg_node = gsk_renderer_create_render_node (renderer);
       gsk_render_node_set_name (bg_node, str);
       gsk_render_node_set_bounds (bg_node, bounds);
-      cr = gsk_render_node_get_draw_context (bg_node);
+      cr = gsk_render_node_get_draw_context (bg_node, renderer);
       cairo_translate (cr, x, y);
       _gtk_theming_background_paint_color (&bg, cr, bg_color, background_image);
       cairo_destroy (cr);
@@ -543,7 +543,7 @@ gtk_css_style_add_background_render_nodes (GtkCssStyle      *style,
                                       translate_blend_mode (blend_mode));
       gsk_render_node_set_name (bg_node, str);
       gsk_render_node_set_bounds (bg_node, bounds);
-      cr = gsk_render_node_get_draw_context (bg_node);
+      cr = gsk_render_node_get_draw_context (bg_node, renderer);
       cairo_translate (cr, x, y);
       _gtk_theming_background_paint_layer (&bg, idx, cr, GTK_CSS_BLEND_MODE_NORMAL);
       cairo_destroy (cr);
@@ -559,7 +559,7 @@ gtk_css_style_add_background_render_nodes (GtkCssStyle      *style,
       bg_node = gsk_renderer_create_render_node (renderer);
       gsk_render_node_set_name (bg_node, str);
       gsk_render_node_set_bounds (bg_node, bounds);
-      cr = gsk_render_node_get_draw_context (bg_node);
+      cr = gsk_render_node_get_draw_context (bg_node, renderer);
       cairo_translate (cr, x, y);
       _gtk_css_shadows_value_paint_box (box_shadow,
                                         cr,
index 1fd5d7ee0ec6238fe19fb27df94376c813fee0e3..cdb69f49ff922053c56548616b9c4dca9afec9d4 100644 (file)
@@ -15676,7 +15676,7 @@ gtk_widget_get_render_node (GtkWidget   *widget,
       gsk_render_node_set_bounds (tmp, &bounds);
       gsk_render_node_set_transform (tmp, &m);
 
-      cr = gsk_render_node_get_draw_context (tmp);
+      cr = gsk_render_node_get_draw_context (tmp, renderer);
       cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
       gtk_widget_draw_internal (widget, cr, TRUE);
       cairo_destroy (cr);
@@ -15705,7 +15705,7 @@ gtk_widget_get_render_node (GtkWidget   *widget,
           gsk_render_node_set_name (tmp, str);
           gsk_render_node_set_bounds (tmp, &bounds);
 
-          cr = gsk_render_node_get_draw_context (tmp);
+          cr = gsk_render_node_get_draw_context (tmp, renderer);
           cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y);
           g_signal_emit (widget, widget_signals[DRAW], 0, cr, &result);
           cairo_destroy (cr);
index 1eeb7464504f7a2815de886f8a47624221f8087e..46030d1a12ef377c94b6354f6ce6bbcbb325415a 100644 (file)
@@ -9410,7 +9410,7 @@ gtk_window_get_render_node (GtkWidget   *widget,
   gsk_render_node_set_bounds (node, &bounds);
   gsk_render_node_set_transform (node, &m);
 
-  cr = gsk_render_node_get_draw_context (node);
+  cr = gsk_render_node_get_draw_context (node, renderer);
 
   if (priv->client_decorated &&
       priv->decorated &&